ホームに戻る
出典 :
UserControl クラス (System.Windows.Controls) | Microsoft Docs コントロールの作成の概要 - WPF .NET Framework | Microsoft Docs C# WPF Window,Page,UserControlの違い #C# - Qiita
関連 :
データバインディング RelativeSource 依存関係プロパティ (DependencyProperty) テンプレート リソース スタイル
目次 :

ユーザーコントロールの概要

複数のコントロールを組み合わせたものをひとつのコントロールとして使いまわしたい場合、
それらを「ユーザーコントロール」として定義することで、再利用可能なコントロールとなる。
尚、「カスタムコントロール」とは異なる。
外観の複雑なカスタマイズは不可能であるため、カスタマイズを目的とする場合はカスタムコントロールを使用することとなる。

作成手順・実装例

ここでは、2つの Label コントロールを持つユーザーコントロール MachineErrIndicator を作成する。
  1. 準備
    1. Visual Studioメニュー「プロジェクト」>「新しい項目の追加」を選択する。
    2. 「Visual C# アイテム」>「WPF」>「ユーザー コントロール (WPF)」を選択し、任意のコントロール名を割り当てる。
      ここでは "MachineErrIndicator" とする。
  2. XAMLの実装 (MachineErrIndicator.xaml)
    1. デザイン
    2. XAML
  3. コードビハインドの実装 (MachineErrIndicator.xaml.cs)
    プロパティの実装に関しては、依存関係プロパティを参照。

  4. 参照側XAMLの実装 (StatusWindow.xaml)

何が起こっているか

ユーザーコントロールの階層化

ユーザーコントロールには別のユーザーコントロールを含めることも可能である。
最も外側のユーザーコントロールを操作して最も内側のコントロールを変化させたい場合は、
下図のようにデータバインドを各段階で用いる。

上図では依存関係プロパティ MogoProperty を操作することで、ラッパープロパティ Mogo を介して
すぐ内側のユーザーコントロール上の FugaProperty に伝播する。
同様に FugaProperty の変化は Fuga を介して HogeProperty に伝播し、結果として表示に反映される。
(プロパティ Mogo を操作した場合も同様。)

注意が必要な点

UserControl の自立性

UserControl は Window と異なり、独立して表示させることはできない。
つまり、UserControl は Window 内に配置することではじめて動作する。UserControl 内に Window を配置することもできない。

UserControl へのスタイル適用

UserControl に対して、スタイルを定義した外部リソースを適用する際は注意が必要となる。
詳細はリンク先を参照のこと。
(リンク先の Window は UserControl と読み替えられたし。)